package cc.idoone.spring_boot_hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.boot.web.servlet.ServletContextInitializer;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;

/**
 * <p>
 * 运行应用：mvn spring-boot:run 或在IDE中运行 main()方法，在浏览器中访问 http://localhost:8080
 * <p>
 * <p>
 * 这个 java 类最好放到和其他层级同级的根目录中，这里就是 cc.idoone.spring_boot_hello 下，
 * 因为这个类的注解 @SpringBootApplication 会默认扫描与它同级目录的其他文件。这样才能完成注入等操作。
 * 如果你把它放到了和其他层的代码一样的级别中，则要用这种注解才行。
 * </p>
 * <p>Spring Boot建议将我们 main 方法所在的这个主要的配置类配置在根包名下。</p>
 * <p>
 * <p>
 * - @SpringBootApplication: 是Spring Boot提供的注解，他相当于加上如下注解：<br/>
 * ---- @Configuration: 表明Application是一个Spring的配置对象，用于配置Spring应用上下文。<br/>
 * ---- @EnableAutoConfiguration: Spring Boot会根据类路径（classpath）以及一些属性值来自动完成一些配置行为，例如：开发基于SpringMVC的Web应用，需要在配置中加上<br/>
 * ---- @EnableWebMvc: 直接来激活一些默认的Web配置， 一旦Spring Boot发现运行时类路径上包含了 spring-webmvc 依赖，它会自动的完成一个Web应用的基本配置，例如配置 DispatcherServlet等等。<br/>
 * ---- @ComponenScan: 告知Spring 应用从什么位置去发现 Spring构件（@Component, @Service, @Configuration）等等
 * </p>
 * <p>
 * - @Controller 基本的前端控制器<br/>
 * - @RestController 这个注解相当于同时添加 @Controller 和 @ResponseBody 注解<br/>
 * - @EnableAutoConfiguration SpringBoot会自动根据你jar包的依赖来自动配置项目的数据源依赖<br/>
 * - @ComponentScan(basePackages = { "controller", "service", "dao" })<br/>
 * - @ComponentScan 路径被默认设置为 Application 的同名package，也就是该package下的
 * 所有@Controller, @Service, @Component, @Repository 都会被实例化后并加入Spring Context中。
 * 这也是为什么要把这个类最好放到与其他包同级目录 的原因了。
 * </p>
 *
 * @author museummjhe@foxmail.com
 * @date 2017年7月11日
 */
@SpringBootApplication
@EnableTransactionManagement //等同于xml配置方式的 <tx:annotation-driven />
@EnableScheduling
// @ServletComponentScan
// @ComponentScan(basePackages = "cc.idoone.spring_boot_hello")
public class Application implements ServletContextInitializer {

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
		// SpringApplication.run(new String[] {
		// 		"classpath*:app/config/spring-*.xml",
		// 		"classpath*:app/config/spring-session-redis.xml"
		// 		//....
		// }, args);
	}

	@Override
	public void onStartup(ServletContext servletContext) throws ServletException {
		// servletContext.addServlet("helloServlet", new HelloServlet()).addMapping("/hello/servlet");
		// servletContext.addFilter("helloFilter", new HelloFilter()).addMappingForServletNames(EnumSet.of(DispatcherType.REQUEST), true, "helloServlet");
		// servletContext.addListener(new HelloListener());
	}

}